home *** CD-ROM | disk | FTP | other *** search
/ MACD 5 / MACD 5.bin / workbench / docs / asm_guide / examples / nonsystemstartup.s < prev    next >
Text File  |  1991-10-24  |  4KB  |  172 lines

  1. ;************************************************
  2. ;*    Friendly non-system startup routine    *
  3. ;*    Made as help to demo and game creaters    *
  4. ;*                        *
  5. ;*  ASM-One example coded by Rune Gram-Madsen    *
  6. ;*                        *
  7. ;*   All rights reserved. Copyright (c) 1990    *
  8. ;************************************************
  9.  
  10. ;*****************
  11. ;*   Constants   *
  12. ;*****************
  13.  
  14. OldOpenLibrary    = -408
  15. CloseLibrary    = -414
  16.  
  17. DMASET=    %1000000111000000
  18. ;     -----a-bcdefghij
  19.  
  20. ;    a: Blitter Nasty
  21. ;    b: Bitplane DMA (if this isn't set, sprites disappear!)
  22. ;    c: Copper DMA
  23. ;    d: Blitter DMA
  24. ;    e: Sprite DMA
  25. ;    f: Disk DMA
  26. ;    g-j: Audio 3-0 DMA
  27.  
  28. START:
  29.     MOVEM.L    D0-D7/A0-A6,-(A7)    ; Put registers on stack
  30.  
  31. ;***********************************
  32. ;*   CLOSE ALL SYSTEM INTERRUPTS   *
  33. ;*                                 *
  34. ;*      START DEMO INTERRUPTS      *
  35. ;***********************************
  36.  
  37.     MOVE.L    $4.W,A6            ; Exec pointer to A6
  38.     LEA.L    GfxName(PC),A1        ; Set library pointer
  39.     MOVEQ    #0,D0
  40.     JSR    OldOpenLibrary(A6)    ; Open graphics.library
  41.     MOVE.L    D0,A1            ; Use Base-pointer
  42.     MOVE.L    $26(A1),OLDCOP1        ; Store copper1 start addr
  43.     MOVE.L    $32(A1),OLDCOP2        ; Store copper1 start addr
  44.     JSR    CloseLibrary(A6)    ; Close graphics library
  45.  
  46.     LEA    $DFF000,A6
  47.     MOVE.W    $1C(A6),INTENA        ; Store old INTENA
  48.     MOVE.W    $2(A6),DMACON        ; Store old DMACON
  49.     MOVE.W    $10(A6),ADKCON        ; Store old ADKCON
  50.  
  51.     MOVE.W    #$7FFF,$9A(A6)        ; Clear interrupt enable
  52.  
  53.     BSR.L    Wait_Vert_Blank
  54.  
  55.     MOVE.W    #$7FFF,$96(A6)        ; Clear DMA channels
  56.     MOVE.L    #COPLIST,$80(A6)    ; Copper1 start address
  57.     MOVE.W    #DMASET!$8200,$96(A6)    ; DMA kontrol data
  58.     MOVE.L    $6C.W,OldInter        ; Store old inter pointer
  59.     MOVE.L    #INTER,$6C.W        ; Set interrupt pointer
  60.  
  61.     MOVE.W    #$7FFF,$9C(A6)        ; Clear request
  62.     MOVE.W    #$C020,$9A(A6)        ; Interrupt enable
  63.  
  64. ;****       Your main routine      ****
  65.  
  66.  
  67. ;**** Main Loop  Test mouse button ****
  68.  
  69. LOOP:
  70.     BTST    #6,$BFE001        ; Test left mouse button
  71.     BNE.S    LOOP
  72.  
  73. ;*****************************************
  74. ;*                     *
  75. ;*   RESTORE SYSTEM INTERRUPTS ECT ECT   *
  76. ;*                     *
  77. ;*****************************************
  78.  
  79.     LEA    $DFF000,A6
  80.  
  81.     MOVE.W    #$7FFF,$9A(A6)        ; Disable interrupts
  82.  
  83.     BSR.S    Wait_Vert_Blank
  84.  
  85.     MOVE.W    #$7FFF,$96(A6)
  86.     MOVE.L    OldCop1(PC),$80(A6)    ; Restore old copper1
  87.     MOVE.L    OldCop2(PC),$84(A6)    ; Restore old copper1
  88.     MOVE.L    OldInter(PC),$6C.W    ; Restore inter pointer
  89.     MOVE.W    DMACON,D0        ; Restore old DMACON
  90.     OR.W    #$8000,D0
  91.     MOVE.W    D0,$96(A6)        
  92.     MOVE.W    ADKCON,D0        ; Restore old ADKCON
  93.     OR.W    #$8000,D0
  94.     MOVE.W    D0,$9E(A6)
  95.     MOVE.W    INTENA,D0        ; Restore inter data
  96.     OR.W    #$C000,D0
  97.     MOVE.W    #$7FFF,$9C(A6)
  98.     MOVE.W    D0,$9A(A6)
  99.     MOVEM.L    (A7)+,D0-D7/A0-A6    ; Get registers from stack
  100.     RTS
  101.  
  102. ;*** WAIT VERTICAL BLANK ***
  103.  
  104. Wait_Vert_Blank:
  105.     BTST    #0,$5(A6)
  106.     BEQ.S    Wait_Vert_Blank
  107. .loop    BTST    #0,$5(A6)
  108.     BNE.S    .loop
  109.     RTS
  110.  
  111. ;*** DATA AREA ***
  112.  
  113. GfxName        DC.B    'graphics.library',0
  114.         even
  115. DosBase        DC.L    0
  116. OldInter    DC.L    0
  117. OldCop1        DC.L    0
  118. OldCop2        DC.L    0
  119. INTENA        DC.W    0
  120. DMACON        DC.W    0
  121. ADKCON        DC.W    0
  122.  
  123. ;**********************************
  124. ;*                  *
  125. ;*    INTERRUPT ROUTINE. LEVEL 3  *
  126. ;*                  *
  127. ;**********************************
  128.  
  129. INTER:
  130.     MOVEM.L    D0-D7/A0-A6,-(A7)    ; Put registers on stack
  131.     LEA.L    $DFF000,A6
  132.     MOVE.L    #SCREEN,$E0(A6)
  133.  
  134. ;---  Place your interrupt routine here  ---
  135.  
  136.     MOVE.W    #$4020,$9C(A6)        ; Clear interrupt request
  137.     MOVEM.L    (A7)+,D0-D7/A0-A6    ; Get registers from stack
  138.     RTE
  139.  
  140. ;*****************************
  141. ;*                 *
  142. ;*      COPPER1 PROGRAM      *
  143. ;*                 *
  144. ;*****************************
  145.  
  146.     SECTION    Copper,DATA_C
  147.  
  148. COPLIST:
  149.     DC.W    $0100,$1200    ; Bit-Plane control reg.
  150.     DC.W    $0102,$0000    ; Hor-Scroll
  151.     DC.W    $0104,$0010    ; Sprite/Gfx priority
  152.     DC.W    $0108,$0000    ; Modolu (odd)
  153.     DC.W    $010A,$0000    ; Modolu (even)
  154.     DC.W    $008E,$2C81    ; Screen Size
  155.     DC.W    $0090,$2CC1    ; Screen Size
  156.     DC.W    $0092,$0038    ; H-start
  157.     DC.W    $0094,$00D0    ; H-stop
  158.  
  159.     DC.W    $0180,$0000    ; Color #0 = 000
  160.     DC.W    $0182,$0FFF    ; Color #1 = fff
  161.     DC.L    $FFFFFFFE
  162.  
  163. ;*****************************
  164. ;*                 *
  165. ;*      SCREEN DATA AREA     *
  166. ;*                 *
  167. ;*****************************
  168.  
  169.     SECTION    Screen,BSS_C
  170.  
  171. SCREEN    DS.B    40*256
  172.